home *** CD-ROM | disk | FTP | other *** search
/ MacHack 2000 / MacHack 2000.toast / pc / The Hacks / FinderGrok / osa stuff / Stringiness.cp < prev    next >
Text File  |  2000-06-23  |  4KB  |  221 lines

  1. #include "Stringiness.h"
  2. #include "Str255.h"
  3.  
  4. #include <sstream>
  5. #ifdef macintosh
  6. #include <UMemoryMgr.h>
  7. #endif
  8.  
  9. using std::string;
  10. using std::ostringstream;
  11.  
  12. string
  13. BytesAsString(unsigned long number)
  14. {
  15.     const unsigned long kOneMegabyte = 1024 * 1024;
  16.  
  17.     if (number == 0)
  18.         return "zero K";
  19.     if (number < kOneMegabyte)
  20.         return AsString((number + 512) / 1024) + "K";
  21.     
  22.     unsigned long megabytes = number / kOneMegabyte;
  23.     unsigned long remainder = number - megabytes * kOneMegabyte;
  24.     unsigned long tenths = (remainder * 10 + (kOneMegabyte / 2)) / kOneMegabyte;
  25.     if (tenths == 0)
  26.         return AsString(megabytes) + " MB";
  27.  
  28.     return AsString(megabytes) + "." + AsString(tenths) + " MB";
  29. }
  30.  
  31. string
  32. AsString(short number)
  33. {
  34.     ostringstream out;
  35.     out << number;
  36.     return out.str();
  37. }
  38.  
  39. string
  40. AsString(unsigned short number)
  41. {
  42.     ostringstream out;
  43.     out << number;
  44.     return out.str();
  45. }
  46.  
  47. string
  48. AsString(int number)
  49. {
  50.     ostringstream out;
  51.     out << number;
  52.     return out.str();
  53. }
  54.  
  55. string
  56. AsString(unsigned number)
  57. {
  58.     ostringstream out;
  59.     out << number;
  60.     return out.str();
  61. }
  62.  
  63. string
  64. AsString(long number)
  65. {
  66.     ostringstream out;
  67.     out << number;
  68.     return out.str();
  69. }
  70.  
  71. string
  72. AsString(unsigned long number)
  73. {
  74.     ostringstream out;
  75.     out << number;
  76.     return out.str();
  77. }
  78.  
  79. string
  80. AsString(double number)
  81. {
  82.     ostringstream out;
  83.     out << number;
  84.     return out.str();
  85. }
  86.  
  87. string
  88. HexAsString(unsigned long integer)
  89. {
  90.     ostringstream result;
  91.     result.width(8);
  92.     result.fill('0');
  93.     result << std::uppercase << std::hex << integer;
  94.     return result.str();
  95. }
  96.  
  97. string
  98. CharsAsString(unsigned long integer)
  99. {
  100.     return string((char*)&integer, 4);
  101. }
  102.  
  103. string DateAsString(unsigned long integer)
  104. {
  105.     Str255 dateString;
  106.     DateString(integer, shortDate, dateString, 0);
  107.     return AsString(dateString);
  108. }
  109.  
  110. string TimeAsString(unsigned long integer)
  111. {
  112.     Str255 timeString;
  113.     TimeString(integer, false, timeString, 0);
  114.     return AsString(timeString);
  115. }
  116.  
  117. void
  118. Substitute(string& inString, const string& oldString, const string& newString)
  119. {
  120.     if (oldString == newString)
  121.         return;
  122.     
  123.     std::size_t found;
  124.     do {
  125.         found = inString.find(oldString);
  126.         if (found != string::npos)
  127.             inString.replace(found, oldString.size(), newString);
  128.     } while (found != string::npos);
  129. }
  130.  
  131. std::vector<string>
  132. SplitString(const string& s, const string& delim)
  133. {
  134.     std::vector<string> v;
  135.  
  136.     std::size_t found = 0;
  137.     std::size_t start = 0;
  138.     std::size_t delim_length = delim.length();
  139.     do {
  140.         found = s.find(delim, start);
  141.         if (found != string::npos) {
  142.             v.push_back(string(&s[start], &s[found] - &s[start]));
  143.             start = found + delim_length;
  144.         }
  145.     } while (found != string::npos);
  146.  
  147.     if (start < s.length()) {
  148.         v.push_back(string(&s[start], &s[s.length()] - &s[start]));
  149.     }
  150.  
  151.     return v;
  152. }
  153.  
  154. string
  155. JoinString(const std::vector<string>& v, const string& delim)
  156. {
  157.     string joinedString;
  158.     for (std::vector<string>::const_iterator i = v.begin(); i != v.end(); i++) {
  159.         if (i != v.begin())
  160.             joinedString.append(delim);
  161.         joinedString.append(*i);
  162.     }
  163.     return joinedString;
  164. }
  165.  
  166. bool StringToTime(const string& inData, LongDateRec& dateTime)
  167. {
  168.     bool dateCacheInit = false;
  169.     static DateCacheRecord dateCache;
  170.  
  171.     if (!dateCacheInit) {
  172.         ThrowIfOSErr_(InitDateCache(&dateCache));
  173.         dateCacheInit = true;
  174.     }
  175.     
  176.     bool isTime = false;
  177.     long lengthUsed;
  178.     StringToDateStatus status = StringToTime(const_cast<char*>(inData.data()), inData.size(), 
  179.         &dateCache, &lengthUsed, &dateTime);
  180.         
  181.     if (noErr == status) {
  182.         isTime = true;
  183.     }
  184.     return isTime;
  185. }
  186.  
  187. #ifdef macintosh
  188.  
  189. string
  190. AsString(Handle handle)
  191. {
  192.     MoveHHi(handle);
  193.     StHandleLocker lock(handle);
  194.     return string(*handle, GetHandleSize(handle));
  195. }
  196.  
  197. class HandleDestroyer {
  198.   public:
  199.     HandleDestroyer(Handle handle) { mHandle = handle; }
  200.     ~HandleDestroyer();
  201.     operator Handle() const { return mHandle; }
  202.   private:
  203.     Handle mHandle;
  204.     HandleDestroyer(const HandleDestroyer&);
  205.     HandleDestroyer& operator =(const HandleDestroyer&);
  206. };
  207.  
  208. HandleDestroyer::~HandleDestroyer()
  209. {
  210.     DetachResource(mHandle);
  211.     DisposeHandle(mHandle);
  212. }
  213.  
  214. string
  215. ConvertToString(Handle handle)
  216. {
  217.     return AsString(HandleDestroyer(handle));
  218. }
  219.  
  220. #endif // macintosh
  221.